package com.meizi.juc;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;

/**
 * @author meizi
 * @email enjoymeizi@gmail.com
 * @date 2021/1/22 16:01
 */
public class ThreadPoolExecutorDemo {
    public static void main(String[] args) {
//        运行流程：
//
//        1、线程池创建，准备好 `core` 数量 的核心线程，准备接受任务
//
//        2、新的任务进来，用 `core` 准备好的空闲线程执行
//
//                - `core` 满了，就将再进来的任务放入阻塞队列中，空闲的 core 就会自己去阻塞队列获取任务执行
//                - 阻塞队列也满了，就直接开新线程去执行，最大只能开到 `max` 指定的数量
//                - `max` 都执行好了，`Max-core` 数量空闲的线程会在 `keepAliveTime` 指定的时间后自动销毁，终保持到 `core` 大小
//                - 如果线程数开到了 `max` 数量，还有新的任务进来，就会使用 reject 指定的拒绝策略进行处理
//
//        3、所有的线程创建都是由指定的 `factory` 创建的

        //创建一个指定长度的线程池，可控制线程最大并发数，超出的线程会再队列中等待
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        //创建一个可缓存的线程池，如果线程池长度超过需要，可灵活回收空闲线程，若无可回收，则新建线程
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        //创建一个定长线程池，支持定时及周期性任务执行
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
        //创建一个单线程化的线程池，她只会用唯一的工作线程来执行任务，保证所有任务
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();



    }

}
